草庐IT

c++ - constexpr 和 ODR

全部标签

c++ - Variadic constexpr 类型选择器

对不起,这个名字太浮夸了,我想创建一个constexpr函数,它接受可变数量的boolean模板参数,并返回“模板索引”第一个true值,在C++11中(仅欢迎C++14解决方案,但不会被接受为答案)。例如调用这个函数SelectorSelector()==0//noneofthetemplateargumentistrueSelector()==1//firsttruetemplateargumentisthefirstoneSelector()==3//..andhereit'sthethirdone这个的典型用法,以及我称之为“类型选择器”的原因,是Selector::value

c++ - 错误 C2196 : case value '?' already used

好的,在代码中使用VisualStudioUltimate2012构建时出现奇怪的错误(可能是ANSI、unicode等问题)...switch(input[index]){case'א'://AlefHebrewcharacterif(/*conditional*/){//Dostuff.}break;case'ב'://BethHebrewcharacterif(/*conditional*/){//Dostuff}break;default:{//Dosomeotherstuff.}break;}第二个case参数生成...ErrorC2196:casevalue'?'alrea

C++11 - 无法使用 constexpr 函数定义 constexpr 文字?

我遇到了一个看似违反直觉的错误,即无法将constexpr函数的值分配给constexpr文字(希望我正在使用语言正确)。这是示例:classMyClass{public:staticconstexprintFooValue(intn){returnn+5;}staticconstexprintFoo5=FooValue(5);//compilererrorstaticconstexprintFoo5Alt(void){returnFooValue(5);}//OK};在GCC4.8.4中,Foo5被标记为fieldinitializerisnotconstant。找到thisthre

c++ - `(c = *str) != 0` 是什么意思?

intequiv(char,char);intnmatches(char*str,charcomp){charc;intn=0;while((c=*str)!=0){if(equiv(c,comp)!=0)n++;str++;}return(n);}“(c=*str)!=0”到底是什么意思?有人可以向我解释一下或帮助我提供正确的术语以自己搜索解释吗? 最佳答案 这个表达式有两部分:c=*str-这是通过取消引用指针对c的简单赋值,val!=0-这是与零的比较。这是可行的,因为赋值是一个表达式,即它有一个值。赋值的值与被赋值的值相同,

c++ - gcc 和 clang 中 constexpr 静态成员变量的链接器错误

我有一个片段:enumclassEC{a,b};structB{constexprB(ECec):ec_(ec){}ECec_;};structA_base{constexprA_base(Bb):b_(b){}Bb_;};structA:A_base{staticconstexprBbbb=EC::a;constexprA(Bbbbb):A_base(bbbb){}};intmain(){Aa1(A::bbb);//1Aa2{A::bbb};//2Aa3=A::bbb;//3Aa4={A::bbb};//4}它在支持c++17的现代编译器中编译良好。使用c++11和c++14标准支持

c++ - 为什么我们需要在编译期间包含 C 或 CPP 声明文件而不是像 iostream 这样的默认库?

如果C或CPP程序需要使用我们自己的带有声明的头文件和带有定义的cpp文件进行编译,我们需要在编译命令中包含带有定义的cpp文件(参见thisanswer)。但是,当我们写#include,我们不包括iostream.cpp在类似g++main.cppiostream.cpp-omain的编译语句中.如果我们编写自定义声明文件,例如hello.hpp带有类声明和hello.cpp有了定义,我们需要使用g++main.cpphello.cpp-omain编译它包括hello.hpp之后在标题中main.cpp文件。这是为什么?编辑:我们是否可以为我们的自定义头文件和cpp文件模仿标准模板

c++ - 键入强制转换文字有意义吗?

所以我正在研究内存受限的嵌入式系统,并希望尽可能多地节省字节数。如果,在我的代码中,如果我有如下语句:b=a或b+=1;其中a和b是uint8_t。将文字类型转换为相同类型是否有益,还是由编译器完成:b=a 最佳答案 isitbeneficialtotyecasttheliteraltosametypeorisitdonebycompiler:关于编译器如何将常量值存储在它创建的二进制文件中,您受制于编译器。没有特别的理由认为像您建议的强制转换会改变使用的表示形式,因为它们名义上表示runtime转换(在这种情况下来自int)。此外

python - Python 中的未定义行为

在C或C++我知道有一种东西叫做undefinedbehaviour在表达式求值中,当某些表达式有副作用时。假设我要计算以下内容:c=10f()+g()+c但在某些时候g使c=5。(c是一个glob变量)python中的行为是什么?它会被定义为C吗? 最佳答案 来自python的6.15|文档Pythonevaluatesexpressionsfromlefttoright.Noticethatwhileevaluatinganassignment,theright-handsideisevaluatedbeforetheleft-

c++ - 如果 constexpr 与 sfinae

随着ifconstexpr的引入在c++17,在c++14中使用编译时SFINAE解决的一些问题/c++11现在可以使用ifconstexpr解决,语法更简单。例如,考虑以下编译时递归的基本示例,以生成打印可变数量参数的子例程。#include#includetemplatevoidprint_sfinae(T&&x){std::coutstd::enable_if_t0)>print_sfinae(T0&&x,T&&...rest){std::cout(rest)...);}templatevoidprint_ifconstexpr(T0&&x,T&&...rest){ifconst

c++ - 为什么在堆栈中我的函数局部变量之间有内存空间?

我有一个在Ubuntux86上用gcc编译的C程序。这是我从main调用的函数voidaddme(){longa=5;charc='3';longarray[3];array[0]=2;array[1]=4;array[2]=8;}如果我在最后一行中断,然后调试/检查这就是我得到的(gdb)print&a$5=(long*)0xbffff04c(gdb)print&c$6=0xbffff04b"3\005"(gdb)print&array$7=(long(*)[3])0xbffff03c(gdb)x0xbffff03c0xbffff03c:0x00000002(gdb)x0xbffff